from rest_framework import serializers

from drfstudy.models import Student,Classes



class StudentSerializerSimple(serializers.ModelSerializer):
    class Meta:
        model = Student
        exclude = ["is_delete","create_time","update_time","classes"]



class StudentSerializer(serializers.ModelSerializer):
    # 新增属性值 classes_name 自定义的名称
    # 班级名称 来自于班级模型   student.classes.name
    # 序列化 相应到客户端的时候  班级的名称 只是给你看的
    classes_name  = serializers.CharField(source="classes.name",read_only=True)

    class Meta:
        model = Student
        # fields = '__all__'
        # 序列化 反序列化 都无法操作了
        exclude = ["is_delete"]
        # 简单字段的校验规则

        extra_kwargs = {
            # "age":{"min_value":16,"max_value":100},
            # 反序列化的时候 能写  不能读取
            "classes":{"write_only":True}
        }

    # 校验
    # 学生的名字里面 带上 one drf
    # 属性级别的校验（某一个字段的额外校验）
    # def validate_name(self, value):# value 客户端传入的name字段数据 （改字段的数据）
    #     if "drf" not in value:
    #         raise serializers.ValidationError("用户名必须带有drf")
    #     return value

    # 多个字段加校验呢
    # 对象级别的校验
    # attrs 客户端传入的所有数据  {"name":"zhangsan","age":18}
    def validate(self,attrs):
        if "drf" not in attrs.get("name").lower():
            raise serializers.ValidationError("用户名必须带有drf")

        if 18 > attrs.get("age"):
            raise serializers.ValidationError("未成年用户禁止使用")
        return attrs


# 学生模型的序列化器
# class StudentSerializer(serializers.Serializer):
#     #针对于已有模型类的时候  才可以继承ModelSerializer
#     # read_only只读
#     id = serializers.IntegerField(read_only=True,label='ID')
#     name = serializers.CharField(required=False,max_length=20,label='姓名')
#     # required=False 允许为空
#     age = serializers.IntegerField(required=False,label="年龄")
#     sex = serializers.IntegerField(required=False,label="性别")
#     create_time = serializers.DateTimeField(required=False,label="创建时间")
#     update_time = serializers.DateTimeField(required=False,label="修改时间")
#     is_delete = serializers.BooleanField(required=False,label="逻辑删除",default=False)
#
#
#     # 重写 create 方法 保存数据
#     def create(self, validated_data):
#         #validated_data 保存的是 前端传入通过StudentSerializer转python格式的数据
#         # **{"name":"bd"}  函数拆包
#         return  Student.objects.create(**validated_data)
#
#     def update(self, instance, validated_data):
#         # instance 原来的数据
#         # validated_data 新数据
#         # get() 有数据则更改  没有数据则保持原来的数据
#         instance.name = validated_data.get('name', instance.name)
#         instance.age = validated_data.get('age', instance.age)
#         instance.sex = validated_data.get('sex', instance.sex)
#         instance.save()
#         # 返回修改后的模型数据
#         return instance





class ClassesSerializer(serializers.ModelSerializer):
    # 序列化器 套序列化器
    # 班级表 展示学生信息  一对多
    # 所有学生的 所有字段信息
    # classes.student_set  StudentSerializer (得到是所有学生的学生信息)
    # 管理器名
    # read_only=True 序列化的时候 只能够查看
    student_set = StudentSerializerSimple(many=True,read_only=True)
    class Meta:
        # 指定序列化的模型表
        model = Classes
        # 指定不映射字段 相应前端json数据时，不带出去
        exclude = ["is_delete"]
